﻿Imports TBCC.UtilityMobile
Public Class AIValueReviseForm

    Private _pi As ProjectItem

    '选择设备的网络地址
    Private _netID As Byte = g_netID

    '起始地址
    Private Const _offset As UShort = 4028

    '数据长度
    Private _length As UShort = 4

    Private buf() As Single

    '正在修改参数标志
    Private _isModify As Boolean = False


    Private Sub ClearData()
        For Each ctl As Control In Me.RevisePanel.Controls
            If ctl.GetType Is GetType(NumericUpDown) Then
                CType(ctl, NumericUpDown).Value = 0
            End If
        Next
    End Sub

    Private Sub TBCCAIReviseForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _pi = Me.MyParentForm.PI

        Select Case _pi.ProjectType
            Case ProjectType_Enum.Car '移动车载
                _length = 4
            Case ProjectType_Enum.Box '小批零
                _length = 1
        End Select

        SetPanelLayout(_pi.ProjectType)
        SetToolTip(_netID)
        Me.RevisePanel.Enabled = False

        'ClearData()

        'Me.HideAllControl()
        If Me.MyParentForm IsNot Nothing Then
            Me.MyParentForm.SetControlEnabled(False)
        End If
        Me.Timer1.Start()

    End Sub

    ''' <summary>
    ''' 保存数据
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
        Dim result As Boolean = False
        Me.Cursor = Cursors.WaitCursor
        Me.btnOK.Enabled = False
        Me.btnCancel.Enabled = False
        Me.RevisePanel.Enabled = False
        Me._isSaving = True
        result = Save()
        Me._isSaving = False
        Me.btnOK.Enabled = True
        Me.btnCancel.Enabled = True
        Me.RevisePanel.Enabled = True

        Me.Cursor = Cursors.Default

        If result Then
            EnableModify(False)
            msg.Show("参数保存成功。")

            RefreshData() '重新读取数据
        Else
            msg.ShowError("参数保存失败。")
        End If
    End Sub

    Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
        '  Me.Close()
    End Sub

    Private Sub btnModify_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModify.Click
        Me.btnModify.Enabled = False
        If EnterModify() = False Then
            msg.Show("无法修改参数请重试。")
            Me.btnModify.Enabled = True
            Exit Sub
        End If

        EnableModify(True)
    End Sub

    Private Sub EnableModify(ByVal value As Boolean)

        Me.btnModify.Enabled = Not value
        Me.btnOK.Enabled = value

        For Each ctl As Control In Me.RevisePanel.Controls
            If ctl.GetType Is GetType(NumericUpDown) Then
                CType(ctl, NumericUpDown).ReadOnly = Not value
                CType(ctl, NumericUpDown).Increment = IIf(value, 1, 0)
            End If
        Next

    End Sub

    '根据设备类型修改panel中numupdw控件的布局
    Private Sub SetPanelLayout(ByVal DevType As Integer)

        Me.NumericUpDown1.Tag = 0
        Me.NumericUpDown2.Tag = 1
        Me.NumericUpDown3.Tag = 2
        Me.NumericUpDown4.Tag = 3
        Me.NumericUpDown5.Tag = 4
        Me.NumericUpDown6.Tag = 5

        Me.NumericUpDown1.Enabled = True
        If DevType = ProjectType_Enum.Car Then '移动车载终端
            Me.NumericUpDown2.Enabled = True
            Me.NumericUpDown3.Enabled = True
            Me.NumericUpDown4.Enabled = True
        ElseIf DevType = ProjectType_Enum.Box Then '小批零终端
            Me.NumericUpDown2.Enabled = False
            Me.NumericUpDown3.Enabled = False
            Me.NumericUpDown4.Enabled = False
        End If

        Me.Label1.Enabled = Me.NumericUpDown1.Enabled
        Me.Label2.Enabled = Me.NumericUpDown2.Enabled
        Me.Label3.Enabled = Me.NumericUpDown3.Enabled
        Me.Label4.Enabled = Me.NumericUpDown4.Enabled
        'Label5.Visible = NumericUpDown5.Visible
        'Label6.Visible = NumericUpDown6.Visible

    End Sub

    Private Sub SetToolTip(ByVal NetID As Integer)
        'Dim portNo As Integer
        ' Dim str As String
        Dim portType As String = "未知"
        Dim rts As New RefTypeService(_pi)

        For i As Integer = 0 To labList.Length - 1
            ToolTip1.SetToolTip(labList(i), "未使用")
            ToolTip1.SetToolTip(nudList(i), "未使用")
        Next

        ''For Each rti As RefTypeItem In rts.GeRefGroupList()
        ''    If rti.NetId = NetID Then
        ''        Dim ats As New AiPortTypeService(rti)
        ''        For Each ati As AiPortTypeItem In ats.GetAiGroupList()
        ''            portNo = ati.PortNo - 1
        ''            If portNo < 0 Then Continue For
        ''            If ati.DataType = 1 Then
        ''                portType = "温度"
        ''            ElseIf ati.DataType = 2 Then
        ''                portType = "湿度"
        ''            End If
        ''            str = String.Format("{0}: {1}({2})", _pi.ProjectName, ati.PortName, portType)
        ''            ToolTip1.SetToolTip(labList(portNo), str)
        ''            ToolTip1.SetToolTip(nudList(portNo), str)
        ''        Next
        ''    End If
        ''Next
        'For i As Integer = 0 To 3
        '    portNo = i
        '    ToolTip1.SetToolTip(labList(portNo), str)
        '    ToolTip1.SetToolTip(nudList(portNo), str)


        'Next

    End Sub

    ''' <summary>
    ''' 保存所有参数
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function Save() As Boolean

        Dim tic As New TranstrationItem()
        'Dim strSql As String

        For i As Integer = 0 To _length - 1
            Dim nud As NumericUpDown = nudList(i)
            If buf(nud.Tag) <> nud.Value Then
                '参数已修改，需要保存
                If Not Save(nud.Tag, nud.Value) Then
                    GoTo ErrorHandler
                End If
                '保存校准日志
                'strSql = String.Format("insert into tbccCalibLog(ProjectID,NetID,CalibTime,CalibType,CalibPort,UserName,OldValue,NewValue) values('{0}',{1},'{2}',{3},{4},'{5}','{6}','{7}' )" _
                ', _pi.ProjectID, _netID, Now.ToString("yyyy-MM-dd HH:mm:ss"), 2, CInt(nud.Tag) + 1, TBCC.UserManage.User.Instance.uName, buf(CInt(nud.Tag)), nud.Value)
                'tic.Add(strSql, Nothing)
            End If
        Next

        '设置修改使能变量
        If ParameterModifyClass.SetModifyConfirm(_netID) = False Then
            Return False
        End If

        ' Me.TimerHeart.Stop()

        ''修改门变量
        'If ExitModify() = False Then
        '    Debug.Write("ExitModify错误")
        'End If

        '执行校准记录保存
        'SqlHelper.ExecuteTranstration(tic)

        Return True

ErrorHandler:
        If ExitModify() = False Then
            Debug.Write("ExitModify错误")
        End If
        Return False

    End Function

    ''' <summary>
    ''' 保存参数
    ''' </summary>
    ''' <param name="index"></param>
    ''' <param name="value"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function save(ByVal index As UShort, ByVal value As Single) As Boolean
        Dim offset As UShort = _offset + index * 2 + 1000
        Return COMHelper.Instance.Write(_netID, FunctionCode.WordWrite, offset, value)
    End Function

    ''' <summary>
    ''' 进入修改
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function EnterModify() As Boolean
        If g_test Then
            _isModify = True
            Return True
        End If

        _isModify = True

        Dim result As Boolean
        result = ParameterModifyClass.EnterModify(_netID)

        If result = False Then
            _isModify = False
            Return False
        End If

        ''开始发送心跳包
        'Me.TimerHeart.Start()

        Return True
    End Function


    ''' <summary>
    ''' 退出修改
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function ExitModify() As Boolean
        '门变量置为1
        Dim result As Boolean
        result = ParameterModifyClass.ExitModify(_netID)

        '停止发送心跳包
        Me.TimerHeart.Stop()

        If result = True Then  '修改门变量成功
            _isModify = False
        End If

        Return True
    End Function


#Region "发送心跳包"

    '心跳包连续发送错误的次数
    Private _heartFailCount As Integer = 0

    '心跳值
    Private _heartValue As Short = 0

    '心跳值是否初始化
    Private _bheartValue As Boolean = False

    '是否正在发送心跳标志
    Private _heartSending As Boolean = False

    '是否正在保存标志
    Public _isSaving As Boolean = False

    '心跳包地址
    Private _heartIncreamentAddress As UShort = 7063

    ''' <summary>
    ''' 发送心跳包
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub HeartSend()
        If _bheartValue = False Then
            Dim b() As Short
            b = COMHelper.Instance.Send4Short(g_netID, FunctionCode.WordWritableRead, _heartIncreamentAddress, 1)
            If b IsNot Nothing AndAlso b.Length = 1 Then
                _heartValue = b(0)
                _bheartValue = True
            Else
                Exit Sub
            End If
        End If

        _heartValue = (_heartValue + 1) Mod UShort.MaxValue

        Dim result As Boolean
        result = COMHelper.Instance.Write(g_netID, FunctionCode.WordWrite, _heartIncreamentAddress, _heartValue)

        If result Then
            _heartFailCount = 0
        Else
            _heartFailCount += 1
        End If

        If _heartFailCount > 10 Then
            '提示用户可能断开连接了.
        End If

    End Sub

    ''' <summary>
    ''' 心跳定时器Tick事件
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TimerHeart_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerHeart.Tick
        If Not g_HeartSend Then
            Exit Sub
        End If

        If _heartSending OrElse _isSaving Then
            Exit Sub
        End If

        _heartSending = True
        Me.HeartSend()
        _heartSending = False
    End Sub

#End Region

    Protected Overrides Sub OnClosing(ByVal e As System.ComponentModel.CancelEventArgs)
        If Me._isModify Then
            Me.ExitModify()
        End If
        MyBase.OnClosing(e)
    End Sub

    ''' <summary>
    ''' 刷新AI原点修正数据
    ''' </summary>
    ''' <remarks></remarks>
    Private Function RefreshData() As Boolean
        Me.Cursor = Cursors.WaitCursor
        Try
            buf = COMHelper.Instance.Send4Single(_netID, FunctionCode.WordWritableRead, _offset, _length * 2)
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
        Finally
            Me.Cursor = Cursors.Default
        End Try

        If buf Is Nothing Then
            Me.btnModify.Enabled = False
            ClearData()
            msg.ShowError(g_strReadError)
            Return False
        End If

        Me.btnModify.Enabled = True

        Dim nud As NumericUpDown
        Dim value As Single
        For i As Integer = 0 To _length - 1
            nud = nudList(i)
            value = buf(i)
            If value >= nud.Minimum AndAlso value <= nud.Maximum Then
                nud.Value = value
            Else
                nud.Value = 0
            End If
        Next

        Return True

    End Function

    Private labList(3) As Label
    Private nudList(3) As NumericUpDown
    Public Sub New()

        ' 此调用是 Windows 窗体设计器所必需的。
        InitializeComponent()

        ' 在 InitializeComponent() 调用之后添加任何初始化。
        labList(0) = Label1
        labList(1) = Label2
        labList(2) = Label3
        labList(3) = Label4
        'labList(4) = Label5
        'labList(5) = Label6
        For Each l As Label In labList
            ToolTip1.SetToolTip(l, "未使用")
        Next

        nudList(0) = NumericUpDown1
        nudList(1) = NumericUpDown2
        nudList(2) = NumericUpDown3
        nudList(3) = NumericUpDown4
        'nudList(4) = NumericUpDown5
        'nudList(5) = NumericUpDown6
        For Each n As NumericUpDown In nudList
            ToolTip1.SetToolTip(n, "未使用")
        Next
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Me.Timer1.Stop()
        If RefreshData() = True Then
            Me.btnModify.Enabled = True
            Me.RevisePanel.Enabled = True
        End If
        If Me.MyParentForm IsNot Nothing Then
            Me.MyParentForm.SetControlEnabled(True)
        End If
    End Sub

End Class